<?php

namespace app\service;

use OSS\Core\OssException;
use OSS\OssClient;
use support\Response;

class OssService
{

    /**
     * 上传oss文件
     * @param int $type 类型 1.不指定具体的name 2.特定上传文件
     * @param string $bucket 填写Bucket名称
     * @return array|Response
     */
    public function uploadOssFiles(int $type = 2, string $bucket = "tiktokus")
    {
        $accessKeyId = config('cloud.aliyah_oss.access_key_id');
        $accessKeySecret = config('cloud.aliyah_oss.access_key_secret');
        //填写Bucket所在地域对应的Endpoint。以华东1（杭州）为例，Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。
        $endpoint = config('cloud.aliyah_oss.endpoint');
        $data = [];
        $ossClient = new OssClient($accessKeyId, $accessKeySecret, $endpoint);
        if ($type == 1) {
            $file = request()->file();
            if (empty($file)) {
                return errorMessage("请上传文件");
            }
            foreach ($file as $key => $spl_file) {
                //文件是否有效，例如ture|false
                $isValid = $spl_file->isValid();
                if ($isValid) {
                    // 上传文件后缀名，例如'jpg'
                    $getUploadExtension = $spl_file->getUploadExtension();
                    //上传文件mine类型，例如 'image/jpeg'
                    $getUploadMimeType = $spl_file->getUploadMimeType();
                    // 获得文件大小，例如 13364，单位字节
                    $getSize = $spl_file->getSize();
                    // 获得上传的目录，例如 '/tmp'
                    $getPath = $spl_file->getPath();
                    // 填写本地文件的完整路径，例如D:\\localpath\\examplefile.txt。如果未指定本地路径，则默认从示例程序所属项目对应本地路径中上传文件。
                    //$filePath = public_path("examplefile.txt");
                    // 获得临时文件路径，例如 `/tmp/workerman.upload.SRliMu`
                    $filePath = $spl_file->getRealPath();
                    // 填写Object完整路径，例如exampledir/exampleobject.txt。Object完整路径中不能包含Bucket名称。
                    $object = "image/" . date('Y-m-d') . '/' . date('Hi') . mt_rand(10000, 99999) . "." . $getUploadExtension;
                    try {
                        // 执行上传并获取返回 oss 信息
                        $info = $ossClient->uploadFile($bucket, $object, $filePath);
                        $ossUrl = $info['oss-request-url'];
                        // 如果图片的协议是http，则转换成https
                        if (substr($ossUrl, 0, 4) == 'http') {
                            $ossUrl = substr_replace($ossUrl, 'https', 0, 4);
                        }
                        $data[] = [
                            'file_url' => $ossUrl,
                            'file_name' => basename($ossUrl)
                        ];
                    } catch (OssException $e) {
                        return errorMessage($e->getMessage());
                    }
                }
            }
        } elseif ($type == 2) {

            $file = request()->file('__file__');
            if ($file && $file->isValid()) {
                // 上传文件后缀名，例如'jpg'
                $getUploadExtension = $file->getUploadExtension();
                $filePath = $file->getRealPath();
                // 填写Object完整路径，例如exampledir/exampleobject.txt。Object完整路径中不能包含Bucket名称。
                $object = "video/" . date('Y-m-d') . '/' . date('Hi') . mt_rand(10000, 99999) . "." . $getUploadExtension;
                try {

                    // 执行上传并获取返回 oss 信息
                    $info = $ossClient->uploadFile($bucket, $object, $filePath);
                    $ossUrl = $info['oss-request-url'];
                    // 如果图片的协议是http，则转换成https
                    if (substr($ossUrl, 0, 4) == 'http') {
                        $ossUrl = substr_replace($ossUrl, 'https', 0, 4);
                    }
                    $data = [
                        'url' => $ossUrl,
                        'name' => basename($ossUrl)
                    ];
                    //保存文件在本地
                    //$file->move(public_path().'/files/myfile.'.$file->getUploadExtension());
                } catch (OssException $e) {
                    return errorMessage($e->getMessage());
                }
            } else {
                return errorMessage("请上传文件");
            }
        } else {
            return errorMessage("类型错误");
        }
        return successMessage("上传成功", $data);
    }

    /**
     * 下载oss文件
     * @param string $oss_object_url oss链接或者是Object完整路径
     * @return Response
     */
    public function downloadOssFiles(string $oss_object_url): Response
    {
        $accessKeyId = config('cloud.aliyah_oss.access_key_id');
        $accessKeySecret = config('cloud.aliyah_oss.access_key_secret');
        //填写Bucket所在地域对应的Endpoint。以华东1（杭州）为例，Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。
        $endpoint = config('cloud.aliyah_oss.endpoint');
        //填写Bucket名称
        $bucket = 'tiktokus';
        // 填写不包含Bucket名称在内的Object完整路径，例如testfolder/exampleobject.txt。
        if (strpos($oss_object_url, $endpoint) !== false) {
            $oss_object_url = str_replace($endpoint, '', $oss_object_url);
        }
        $object = $oss_object_url;
        // 下载Object到本地文件examplefile.txt，并保存到指定的本地路径中（D:\\localpath）。如果指定的本地文件存在会覆盖，不存在则新建。
        // 如果未指定本地路径，则下载后的文件默认保存到示例程序所属项目对应本地路径中。
        $localfile = public_path($oss_object_url);
        $options = array(
            OssClient::OSS_FILE_DOWNLOAD => $localfile
        );
        // 使用try catch捕获异常。如果捕获到异常，则说明下载失败；如果没有捕获到异常，则说明下载成功。
        try {
            $ossClient = new OssClient($accessKeyId, $accessKeySecret, $endpoint);
            // 执行上传并获取返回 oss 信息
            $data = $ossClient->getObject($bucket, $object, $options);
            return successMessage("操作成功", ['localfile' => $data]);
        } catch (OssException $e) {
            return errorMessage($e->getMessage());
        }
    }
}
